home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / DJLSR111.ZIP / libsrc / c / gen / tmpnam.c < prev    next >
C/C++ Source or Header  |  1993-08-29  |  3KB  |  130 lines

  1. /* This is file TMPNAM.C */
  2. /* This file may have been modified by DJ Delorie (Jan 1991).  If so,
  3. ** these modifications are Coyright (C) 1993 DJ Delorie, 24 Kirsten Ave,
  4. ** Rochester NH, 03867-2954, USA.
  5. */
  6.  
  7. /*
  8.  * Copyright (c) 1988 Regents of the University of California.
  9.  * All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms are permitted provided
  12.  * that: (1) source distributions retain this entire copyright notice and
  13.  * comment, and (2) distributions including binaries display the following
  14.  * acknowledgement:  ``This product includes software developed by the
  15.  * University of California, Berkeley and its contributors'' in the
  16.  * documentation or other materials provided with the distribution and in
  17.  * all advertising materials mentioning features or use of this software.
  18.  * Neither the name of the University nor the names of its contributors may
  19.  * be used to endorse or promote products derived from this software without
  20.  * specific prior written permission.
  21.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  22.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  23.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  24.  */
  25.  
  26. #if defined(LIBC_SCCS) && !defined(lint)
  27. static char sccsid[] = "@(#)tmpnam.c    4.8 (Berkeley) 6/22/90";
  28. #endif /* LIBC_SCCS and not lint */
  29.  
  30. #include <sys/param.h>
  31. #include <sys/types.h>
  32. #include <stdio.h>
  33.  
  34. #ifndef P_tmpdir
  35. #define    P_tmpdir    "/usr/tmp"
  36. #endif
  37.  
  38. typedef struct FILE_a {
  39.   char *name;
  40.   struct FILE_a *next;
  41. } FILE_a;
  42.  
  43. static int close_registered=0;
  44. static FILE_a *file_a=0;
  45. static void tmp_close()
  46. {
  47.   while (file_a)
  48.   {
  49.     FILE_a *n = file_a->next;
  50.     unlink(file_a->name);
  51.     free(file_a->name);
  52.     free(file_a);
  53.     file_a = n;
  54.   }
  55. }
  56.  
  57. FILE *
  58. tmpfile()
  59. {
  60.     FILE *fp;
  61.     FILE_a *filea;
  62.     char *f, *tmpnam();
  63.  
  64.     if (!(f = tmpnam((char *)NULL)) || !(fp = fopen(f, "w+"))) {
  65.         fprintf(stderr, "tmpfile: cannot open %s.\n", f);
  66.         return(NULL);
  67.     }
  68.     if (close_registered == 0)
  69.     {
  70.       atexit(tmp_close);
  71.       close_registered = 1;
  72.     }
  73.     filea = (FILE_a *)malloc(sizeof(FILE_a));
  74.     if (filea)
  75.     {
  76.       filea->name = strdup(f);
  77.       filea->next = file_a;
  78.       file_a = filea;
  79.     }
  80.     return(fp);
  81. }
  82.  
  83. static char *tmpnam_buf;
  84.  
  85. char *
  86. tmpnam(s)
  87.     char *s;
  88. {
  89.     char *malloc(), *mktemp();
  90.  
  91.     if (!s)
  92.     {
  93.       if (tmpnam_buf == 0)
  94.       tmpnam_buf = malloc((u_int)MAXPATHLEN);
  95.       if (tmpnam_buf == 0)
  96.         return(NULL);
  97.       s = tmpnam_buf;
  98.     }
  99.     (void)sprintf(s, "%s/XXXXXX", P_tmpdir);
  100.     return(mktemp(s));
  101. }
  102.  
  103. char *
  104. tempnam(dir, pfx)
  105.     char *dir, *pfx;
  106. {
  107.     char *f, *name, *getenv(), *malloc(), *mktemp();
  108.  
  109.     if (!(name = malloc((u_int)MAXPATHLEN)))
  110.         return(NULL);
  111.  
  112.     if (f = getenv("TMPDIR")) {
  113.         (void)sprintf(name, "%s/%sXXXXXX", f, pfx ? pfx : "");
  114.         if (f = mktemp(name))
  115.             return(f);
  116.     }
  117.     if (dir) {
  118.         (void)sprintf(name, "%s/%sXXXXXX", dir, pfx ? pfx : "");
  119.         if (f = mktemp(name))
  120.             return(f);
  121.     }
  122.     (void)sprintf(name, "%s/%sXXXXXX", P_tmpdir, pfx ? pfx : "");
  123.     if (f = mktemp(name))
  124.         return(f);
  125.     (void)sprintf(name, "/tmp/%sXXXXXX", pfx ? pfx : "");
  126.     if (!(f = mktemp(name)))
  127.         (void)free(name);
  128.     return(f);
  129. }
  130.